package com.charging.business.media;


import com.charging.business.utils.ToolsUtil;

/**
 * CPC卡入口信息文件(DF/EF01)的编码信息
 * @author lzj
 */
public class CpcEf01EdModel {
    public static final int MSG_LEN = 39;

    /**
     * 入口车型(01-01,1,n)
     */
    public byte[] vehicleType = new byte[1];

    /**
     * 车牌号码(02-13,12,s)
     * 牌照 (汉字+字母+数字，不含颜色)信息，采用字符型存储, 汉字采用 GB2312 码
     * ，如： “京”编码为“BEA9”；牌照信息不足 12 字节，后补 0x00
     */
    public byte[] plateNumber = new byte[12];

    /**
     * 车牌颜色(14-14,1,n)
     * 0x00 –蓝色； 0x01–黄色； 0x02 –黑色； 0x03 –白色； 0x04-渐变绿色； 0x05-黄绿双拼色； 0x06-蓝白渐变；0x07～0xFF 保留
     */
    public byte[] plateColor = new byte[1];

    /**
     * 入口收费路网号(15-16,2,h)
     */
    public byte[] netWork = new byte[2];

    /**
     * 入口站号(17-18,2,h)
     */
    public byte[] enStationId = new byte[2];

    /**
     * 入口道号(19-19,1,n)
     */
    public byte[] enLaneId = new byte[1];

    /**
     * 入口时间(20-23,4,n)
     */
    public byte[] enTime = new byte[4];

    /**
     * 5.8GHz工作状态(24-24,1,n)
     * 0x01打开; 0x02关闭
     */
    public byte[] workState = new byte[1];

    /**
     * 流通状态(25-25,1,n)
     * 0x01：封闭式 MTC入口； 0x02：封闭式 MTC出口；0x10：封闭式自助入口
     */
    public byte[] cardState = new byte[1];

    /**
     * 入口车种(26-26,1,n)
     * 0-普通车； 6-公务车； 8-军警车； 10-紧急车； 12-免费；14-车队； 0～20 内其他：自定义；
     * 21-绿通车； 22-联合收割机 ; 23-抢险救灾; 24－J1专用集装箱车；25-大件运输; 26－应急救援车；27－货车列车或半挂汽车列车;28-J2集装箱车
     */
    public byte[] enVehicleClass = new byte[1];

    /**
     * 入口工号(27-29,3,n)
     */
    public byte[] enOperator = new byte[3];

    /**
     * 入口班次(30-30,1,n)
     */
    public byte[] enWorkNo = new byte[1];

    /**
     * 货车轴数(31-31,1,n)
     */
    public byte[] axleCount = new byte[1];

    /**
     * 货车总重(32-35,4,n)
     * 单位:kg,从入口称重检测系统获取，若为客车或无总重信息时全部填写 0xFF
     */
    public byte[] totalWeight = new byte[4];

    /**
     * 核定载重(36-38,3,n)
     * 单位:kg, 无核定载重信息时全部填写 0xFF
     */
    public byte[] approvalWeight = new byte[3];

    /**
     * 特殊货车(39-39,1,n)
     * 0x00－本次通行用于大件运输
     * 0x01－非优惠车辆
     * 0x02－绿通
     * 0x03－联合收割机
     * 0x04－集装箱车辆
     * 0xFF－默认
     */
    public byte[] specialTruck = new byte[1];

    public static CpcEf01EdModel parseSelf(byte[] buff) {
        int index = 0;
        CpcEf01EdModel ret = new CpcEf01EdModel();
        index += ToolsUtil.arrcopy(buff, index, ret.vehicleType);
        index += ToolsUtil.arrcopy(buff, index, ret.plateNumber);
        index += ToolsUtil.arrcopy(buff, index, ret.plateColor);
        index += ToolsUtil.arrcopy(buff, index, ret.netWork);
        index += ToolsUtil.arrcopy(buff, index, ret.enStationId);
        index += ToolsUtil.arrcopy(buff, index, ret.enLaneId);
        index += ToolsUtil.arrcopy(buff, index, ret.enTime);
        index += ToolsUtil.arrcopy(buff, index, ret.workState);
        index += ToolsUtil.arrcopy(buff, index, ret.cardState);
        index += ToolsUtil.arrcopy(buff, index, ret.enVehicleClass);
        index += ToolsUtil.arrcopy(buff, index, ret.enOperator);
        index += ToolsUtil.arrcopy(buff, index, ret.enWorkNo);
        index += ToolsUtil.arrcopy(buff, index, ret.axleCount);
        index += ToolsUtil.arrcopy(buff, index, ret.totalWeight);
        index += ToolsUtil.arrcopy(buff, index, ret.approvalWeight);
        index += ToolsUtil.arrcopy(buff, index, ret.specialTruck);

        // GBK车牌号码矫正
        chkVPlate(ret.plateNumber);

        return ret;
    }

    public static CpcEf01EdModel parse(String strHex) {
        if (strHex == null || strHex.isEmpty()) {
            return null;
        }
//		if(strHex.length()<CPCDFEF01ED.MSG_LEN*2)
//			return null;
        if (!ToolsUtil.chkHexChar(strHex)) {
            return null;
        }
        byte[] buff = ToolsUtil.hex2bin(strHex);
        return parseSelf(buff);
    }

    /**
     * 信息解码
     *
     * @return
     */
    public CpcEf01Model decoded() {
        CpcEf01Model dd = new CpcEf01Model();
        dd.vehicleType = ToolsUtil.bin2int(vehicleType);
        dd.plateNumber = ToolsUtil.bin2str(plateNumber);
        dd.plateColor = ToolsUtil.bin2int(plateColor);
        dd.netWork = ToolsUtil.bin2hex(netWork);
        dd.enStationId = ToolsUtil.bin2hex(enStationId);
        dd.enLaneId = ToolsUtil.bin2int(enLaneId);
        dd.enTime = ToolsUtil.bin2lng(enTime);
        dd.workState = ToolsUtil.bin2int(workState);
        dd.cardState = ToolsUtil.bin2int(cardState);
        dd.enVehicleClass = ToolsUtil.bin2int(enVehicleClass);
        dd.enOperator = ToolsUtil.bin2int(enOperator);
        dd.enWorkNo = ToolsUtil.bin2int(enWorkNo);
        dd.axleCount = ToolsUtil.bin2int(axleCount);
        dd.totalWeight = ToolsUtil.bin2lng(totalWeight);
        dd.approvalWeight = ToolsUtil.bin2int(approvalWeight);
        dd.specialTruck = ToolsUtil.bin2int(specialTruck);

        return dd;
    }

    private static void chkVPlate(byte[] zb) {
        for (int aa = zb.length - 1; aa >= 0; aa--) {
            if (zb[aa] == (byte) 0xff) {
                zb[aa] = 0;
            } else {
                break;
            }
        }
    }
}
